package com.zrrd.straw1.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

//步骤1：添加配置类注解
//步骤2：继承Security框架的配置类
@Configuration
public class SecurityConfig
        extends WebSecurityConfigurerAdapter {
    //步骤3：重写配置用户的方法 （alt + insert)
    //一旦使用配置类添加用户信息，配置文件中的静态设置就失效了。

    //步骤4：用户详情类，（数据库）动态加载用户信息
    @Autowired
    UserDetailsServiceImpl userDetailsServiceImpl;

    //配置授权：哪些可以访问，哪些不能访问
    //重点使用的对象是 HttpSecurity
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //1.可以处理 CSRF 跨域安全
        //2.对请求对象截取请求信息  HttpServletRequest
        //  可以对访问地址进行授权管理
        //3.可以自行设定登录页面和登录服务。

        //关闭 CSRF 跨域安全策略
        http.csrf().disable()
                //security 是对所有路径都进行验证
                //对请求授权进行配置
                .authorizeRequests()
                //有一些信息是需要默认放行。css,js,image,login.html，login
                //  /hello 表示 localhost:8080/hello
                .antMatchers("/test.html",
                        "/hello",
                        "/index.html",
                        "/login.html",
                        "/register.html",
                        "/register",
                        "/login",
                        "/css/*",
                        "/js/*",
                        "/js_bak/*",
                        "/img/**",
                        "/browser_components/**"
                        )
                .permitAll()    //对上面匹配的请求允许通行,不用登录即可访问
                .anyRequest()   //其它的所有请求
                .authenticated()//都需要认证
                .and()   //类似于一句加个逗号
                .formLogin()    //设置登录方式为表单输入
                .loginPage("/login.html")  //自定义登录页面,在/static/下
                .loginProcessingUrl("/login")      //登录服务的路径
                .defaultSuccessUrl("/index.html")  //登录成功，跳转的欢迎页面
                .failureUrl("/login.html?error") //失败路转的页面
                .and()
                .logout()   //配置登出
                .logoutUrl("/logout")  //登出服务url
                .logoutSuccessUrl("/login.html?logout");

    }



    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //使用认证管理器添加一个用户(基于内存)
        /*
        auth.inMemoryAuthentication()
                .withUser("tom")
                .password("{bcrypt}$2a$10$zbqFkaZYf.lX09IgLGrJaOoCekko5eRC7Zv3YeiZUF3bDD6uatjPi")
                //步骤7：给当前用户添加”/zrrd/23-1" 访问权限。
                .authorities("/zrrd/23-1");
        */

        //使用 UserDetailsService 完成加载、使用实现类
        //实际就是调用 loadUserByUsername() 方法。
        auth.userDetailsService( userDetailsServiceImpl );
    }
}
